home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 2109 / 2109.xpi / chrome / febe.jar / content / febeCommon.js < prev    next >
Text File  |  2009-10-23  |  44KB  |  1,196 lines

  1. // author: Chuck Baker
  2. // contact: febe@customsoftwareconsult.com
  3. // Version 6.3
  4.  
  5. //        Common (global) variables
  6. var Cc = Components.classes;
  7. var Ci = Components.interfaces;
  8.  
  9. // These should be constants, but CLEO opens this file and re-declares them
  10. var FEBE_GUID = "{4BBDD651-70CF-4821-84F8-2B918CF89CA3}"  // GUID of this extension
  11. var FEBEDATAFILE = "febeUserDefinedBuData.json";
  12. var febeDebug = Boolean(false);    // Set to "true" to activate 'febeDump' commands.
  13.  
  14. var tmp = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  15.        .getService(Components.interfaces.nsIWindowMediator);
  16. var febeMainWin = tmp.getMostRecentWindow("navigator:browser");
  17.  
  18.  
  19. function febeDump(msg){
  20.     dump(msg);
  21.     return true;
  22. }//febeDump()
  23.     
  24. // Get pointer to preferences
  25.     try{
  26.         var febePrefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("");
  27.     }catch(e){
  28.         var msg = febeMsg[169];
  29.         febeFatal(e,msg);}
  30.  
  31. function febeGetUnicharPref(prefName) {
  32.     return febePrefs.getComplexValue(prefName, Ci.nsISupportsString).data;
  33. }
  34.  
  35. function febeSetUnicharPref(prefName, prefValue) {
  36.     var supportsString = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
  37.     supportsString.data = prefValue;
  38.     febePrefs.setComplexValue(prefName, Ci.nsISupportsString, supportsString);
  39.  
  40. function febeResetPref(prefName) {
  41.     var prefSvc = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService);
  42.     prefSvc.clearUserPref(prefName);
  43.     var pType = prefSvc.getPrefType(prefName);
  44.     switch (pType){
  45.         case prefSvc.PREF_BOOL:    
  46.             var prefVal = febePrefs.getBoolPref(prefName); 
  47.             break;
  48.         case prefSvc.PREF_INT:
  49.             var prefVal = febePrefs.getIntPref(prefName);
  50.             break;
  51.         case prefSvc.PREF_STRING:
  52.             var prefVal = febeGetUnicharPref(prefName);
  53.             break;
  54.     }//switch
  55.     return prefVal;
  56. }
  57.  
  58. // Set global variables
  59.     var febeBUtype = new String();            // "selective" , "profile, or "alternate""
  60.     var febeFEBEbackedUp = Boolean(false);    // Has FEBE itself been backed up?
  61.     var febeExBuDir = new String();            // Directory where the results are stored
  62.     var febeBUdate = new Date();            // Date of backup to restore
  63.     var febePathName = new String();        // Holds full path name of various files
  64.     var febeExtensionsList = {};            // Array holding extension names
  65.     var febeThemesList = {};                // Array holding theme names
  66.     var febeErrorList = [];                    // Array holding failed items (errors)
  67.     var febeWarningList = [];                // Array holding failed items (warnings)
  68.     var febeETinstall = [];                    // Array of ext/theme objects to install
  69.     var febeMsg = [];                        // Array holding localized strings
  70.     var febeTmpDir = new String();            // nsIFile pointer to temp directory
  71.     var febeDestDir = new String();            // nsIFile pointer used in febeDirCopy()
  72.     var febeSubRootDir = new String();        // Used in febeDirCopy()
  73.     var febeBuSeq = new String();            // FEBE Batch Sequence number
  74.     var FEBEdir = new String();                // Pointer to FEBE extension directory
  75.     var febeWin = new Object;                // Window object for FEBE windows
  76.     var febeProfileWin = new Object;        // Profile restore window
  77.     var febeProfDir = new String();            // Pointer to profile directory
  78.     var febeProfName = new String();        // Profile name
  79.     var febeVersion = new String();            // Version of this extension (FEBE)
  80.     var febePrName = new String();            // Leafname of file picker file
  81.     var febePfName = new String()            // Same as febePrName
  82.     var febePfParent = new String()            // Parent directory of filel picker file
  83.     var febeBuDesDir = new String();        // Pointer to backup destination directory
  84.     var febeExtExt = new String();            // ".xpi" (extension) or ".jar" (theme)
  85.     var febeInitialized;                    // Initalize function run yet?
  86.     var febeUseTimestampedDir = Boolean(false);// Create timestamped subdirectories?
  87.     var febeMaxDirs = new Number;            // Maximum number of timestamped directories
  88.     var febeClearDestDir = Boolean(false); // Clear destination directory?
  89.     var febeProfileCreated = new Number;    //  Number of newly created profile 
  90.     var febeProfileIndex = new Number(-1);    // Number of index of profile being restored
  91.     var febePlatform = new Number;            // 1=Windows, 2=*nix, 3=Mac 
  92.     var febeDisabledCount = new Number;        // Count of disabled extensions
  93.     var includeFEBE = new String();            // Include a copy of FEBE with backup?
  94.     var febeUDBuDone = [];                    // Array of completed User-defined backups
  95.     var febeClipboard = [];                    // Holds alert messages for the clipboard
  96.     var febeIgnoreError;                    // Error to ignore
  97.     var febeReminded;                        // If true,  dont show backup reminder
  98.     var febeSkippedScheduledLastChecked = 0;// Used to determined if scheduled  backup was missed (due to sleep mode)
  99.     var febeIsScheduleController = Boolean(false);    // If true, this window is controlling the FEBE scheduler
  100.     var febeControllerWindow = null;        // Pointer to the window that is controlling the scheduled backup
  101.     var febeWelcomePage = new String();        // URL of welcome page
  102.     var febex;                              // Misc flag
  103.     var febeWait;                            // Number of milliseconds until next scheduled backup
  104.     var febeDataFile;                        // Pointer to FEBEDATAFILE
  105.     var febeUploadAborted;                    // Monitors box.net upload
  106.     var febeAlertFinalHeight;                // Used in alert messages
  107.     var febeGlobalExtCouunt = 0;            // Count of globally installed extensions
  108.     var febeLocalizedStr = [];                // "extensions", " themes", "bookmarks", etc.
  109.     var febeObserverService;                // Observer
  110.     var febePopupIsShowing = Boolean(false);    // Is a popup alert box showing?
  111.     var febePendingCount = new Number;                // Number of pending extension/theme installs
  112.     var febeStartTime = new Number;            // Used to time backup
  113.     var febeIsOnlineBackup = Boolean;    // To determine if backup is local or online
  114.     var febeMainWindow;                        // Pointer to main browser window
  115.     var febeStatusSave;                        // Current value of  dom.disable_window_status_change
  116.     var febeProfileBackupIsSelected = Boolean(false);
  117.     var febeProfileDestinationIsSelected = Boolean (false);
  118.     
  119.   // Preferences
  120.     var buExtensions = Boolean(false);        // Backup extensions?
  121.     var buThemes = Boolean(false);            // Backup themes?
  122.     var buBookmarksJSON = Boolean(false);    // Backup bookmarks.(.json)?
  123.     var buBookmarksHTML = Boolean(false);    // Backup bookmarks.(.html)?
  124.     var buPreferences = Boolean(false);        // Backup prefs.js?
  125.     var buCookies = Boolean(false);            // Backup cookies.txt?
  126.     var buUserChrome = Boolean(false);        // Backup userChrome.css?
  127.     var buUserPwd = Boolean(false);            // Backup key3.db and signons.txt?
  128.     var buSearchPlugins = Boolean(false);    // Backup searchplungins directory?
  129.     var buBrowserHistory = Boolean(false);    // Backup history.dat?
  130.     var buFormFillHistory = Boolean(false);    // Backup formhistory.dat?
  131.     var buPermissions = Boolean(false);        // Backup hostperm.1?
  132.     var buUDBu = Boolean(false);            // Backup User-defined backups?
  133.     var buProfile = Boolean(false);            // Backup entire profile?
  134.     var ignoreDisabled = Boolean(false);    // Ignore disabled extension?
  135.     var febeHideIcons = Boolean(false);        // Hide statusbar icons?
  136.     var febeVerifyBackups = Boolean(false);    // Verify backups?
  137.     var febeHideHelp = Boolean(false);        // Hide help icons?
  138.     var febeDispProgress = Boolean(false);    // Display progress window?
  139.     var febeDispResults = Boolean(false);    // Display results page?
  140.     var febeSaveResults = Boolean(false);    // Save results page?
  141.     var febePlaySounds = Boolean(false);    // Play sounds?
  142.  
  143.   // Backup flags    
  144.     var exBackedUp = Boolean(false);    // Did extensions backup ok?
  145.     var thBackedUp = Boolean(false);    // Did themes backup ok?
  146.     var bmBackedUpJSON = Boolean(false);    // Did bookmarks backup ok (.json)?
  147.     var bmBackedUpHTML = Boolean(false);    // Did bookmarks backup ok (.html)?
  148.     var prBackedUp = Boolean(false);    // Did the preferences backup ok?
  149.     var ckBackedUp = Boolean(false);    // Did cookies backup ok?
  150.     var chBackedUp = Boolean(false);    // Did user chrome backup ok?
  151.     var ucBackedUp = Boolean(false);    // Did user content backup ok?
  152.     var pwBackedUp = Boolean(false);    // Did passwords backup ok?
  153.     var spBackedUp = Boolean(false);    // Did search plugins backup ok?
  154.     var hsBackedUp = Boolean(false);    // Did history backup ok?
  155.     var ffBackedUp = Boolean(false);    // Did form fill history backup ok?
  156.     var pmBackedUp = Boolean(false);    // Did permissions file backup ok?
  157.     var udBackedUp = new Number;            // Number of User-defined bu's backed up
  158.     var upBackedUp = Boolean(false);    // Did the user profile backup ok?
  159.     
  160.   // Backup file names
  161.     var bmBuNameJSON = new String();    // Bookmarks backup filename (json)
  162.     var bmBuNameHTML = new String();    // Bookmarks backup filename (.html)
  163.     var prBuName = new String();    // Preferences backup filename
  164.     var ckBuName = new String();    // Cookies backup filename
  165.     var chBuName = new String();    // UserChrome backup filename
  166.     var ucBuName = new String();    // UserContent backup filename
  167.     var pwBuName = new String();    // Password backup filename
  168.     var spBuName = new String();    // Search plugins backup filename
  169.     var hsBuName = new String();    // Browser history backup filename
  170.     var ffBuName = new String();    // Form fill history backup filename
  171.     var pmBuName = new String();    // Permissions backup filename
  172.     var udBuName = new String();    // User-defined backup filename
  173.     var upBuName = new String();    // User profile backup filename
  174.     
  175. function febeSetMsgs(){
  176.   // Error messages, prompts, etc.
  177.     if(!febeMsg[0]){
  178.         try{
  179.             var fs = document.getElementById('febe-strings');
  180.             if(!fs) {    // Can't find it?  Try looking for the FEBE options window
  181.                 var wm = Cc["@mozilla.org/appshell/window-mediator;1"] .getService(Ci.nsIWindowMediator); 
  182.                 var enumerator = wm.getEnumerator("febe:options"); 
  183.                 while(enumerator.hasMoreElements()) { 
  184.                     var win = enumerator.getNext(); 
  185.                     fs = win.document.getElementById('febe-strings');
  186.                 }//while 
  187.             }//if
  188.             var enumerator = fs.strings;
  189.             var cnt=0;
  190.             var id="";
  191.             while (enumerator.hasMoreElements()) {
  192.                 if(cnt > 9){
  193.                     id = cnt.toString();
  194.                 }else{
  195.                     id = "0" + cnt.toString();
  196.                 }// if
  197.                 var msg = "msg"+id;
  198.                 try{
  199.                     febeMsg.push(fs.getString(msg));
  200.                 }catch(e){;}
  201.                 enumerator.getNext();
  202.                 cnt++;
  203.             }//while
  204.         }catch(e){;}
  205.         
  206.         // Localize backup item names
  207.         febeLocalizedStr["extension"] = febeMsg[244];
  208.         febeLocalizedStr["theme"] = febeMsg[245];
  209.         febeLocalizedStr["bookmarks"] = febeMsg[246];
  210.         febeLocalizedStr["preferences"] = febeMsg[247];
  211.         febeLocalizedStr["cookies"] = febeMsg[248];
  212.         febeLocalizedStr["userChrome"] = febeMsg[249];
  213.         febeLocalizedStr["usernames-passwords"] = febeMsg[250];
  214.         febeLocalizedStr["searchPlugins"] = febeMsg[251];
  215.         febeLocalizedStr["history"] = febeMsg[252];
  216.         febeLocalizedStr["ffhistory"] = febeMsg[253];
  217.         febeLocalizedStr["permissions"] = febeMsg[254];
  218.         febeLocalizedStr["userDefined"] = febeMsg[255];
  219.         febeLocalizedStr["profile"] = febeMsg[256];
  220.         febeLocalizedStr["other"] = febeMsg[258];
  221.         febeLocalizedStr["directory"] = febeMsg[259];
  222.         febeLocalizedStr["size"] = febeMsg[260];
  223.         febeLocalizedStr["Uploading:"] = febeMsg[261];
  224.         febeLocalizedStr["uploaded ok"] = febeMsg[262];
  225.         febeLocalizedStr["Febe Backups"] = febeMsg[263];
  226.         febeLocalizedStr["Error:"] = febeMsg[264];
  227.     }//if
  228.     Application.storage.set("febeMsg", febeMsg);    // Save messsages for external routines
  229.     return true;
  230. }//febeSetMsgs()
  231.  
  232. function febeGetPrefs(){
  233.   // Get/set the preferences
  234.     febeUseTimestampedDir = febePrefs.getBoolPref("extensions.febe.useTimestampedDir");
  235.     febeMaxDirs = febePrefs.getIntPref("extensions.febe.maxBuDirs");
  236.     febeClearDestDir = febePrefs.getBoolPref("extensions.febe.clearDestDir");
  237.     febeGetBuType();
  238.     buExtensions = febePrefs.getBoolPref("extensions.febe.buExtensions");
  239.     buThemes = febePrefs.getBoolPref("extensions.febe.buThemes");
  240.     buBookmarksJSON = febePrefs.getBoolPref("extensions.febe.buBookmarks.json");
  241.     buBookmarksHTML = febePrefs.getBoolPref("extensions.febe.buBookmarks.html");
  242.     buPreferences = febePrefs.getBoolPref("extensions.febe.buPreferences");
  243.     buCookies = febePrefs.getBoolPref("extensions.febe.buCookies");
  244.     buUserChrome = febePrefs.getBoolPref("extensions.febe.buUserChrome");
  245.     buUserPwd = febePrefs.getBoolPref("extensions.febe.buUserPwd");
  246.     buSearchPlugins = febePrefs.getBoolPref("extensions.febe.buSearchPlugins");
  247.     buBrowserHistory = febePrefs.getBoolPref("extensions.febe.buBrowserHistory");
  248.     buFormFillHistory = febePrefs.getBoolPref("extensions.febe.buFormFillHistory");
  249.     buPermissions = febePrefs.getBoolPref("extensions.febe.buPermissions");
  250.     buUDBu = febePrefs.getBoolPref("extensions.febe.buUDBu");
  251.     ignoreDisabled = febePrefs.getBoolPref("extensions.febe.ignoreDisabled");
  252.     febeVerifyBackups = febePrefs.getBoolPref("extensions.febe.verifyBackups");
  253.     febePlaySounds = febePrefs.getBoolPref("extensions.febe.playSounds");
  254.     febeHideIcons = febePrefs.getBoolPref("extensions.febe.hideIcons");
  255.     febeHideHelp = febePrefs.getBoolPref("extensions.febe.hidehelp");
  256.     febeHideHelpIcons();
  257.     
  258.     febeDispProgress = febePrefs.getBoolPref("extensions.febe.displayprogresswin");
  259.     febeDispResults = febePrefs.getBoolPref("extensions.febe.displayresultspage");
  260.     febeSaveResults = febePrefs.getBoolPref("extensions.febe.saveresultspage");
  261.     includeFEBE = febePrefs.getBoolPref("extensions.febe.includefebe");
  262.     febeStatusSave = febePrefs.getBoolPref("dom.disable_window_status_change");
  263.     
  264.     // Create pointer to profile directory
  265.     febeProfDir = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
  266.     return true;
  267. }//febeGetPrefs()
  268.  
  269. function febeGetBuType(){
  270.     febeBUtype = febePrefs.getCharPref("extensions.febe.buType");
  271.     var selective = febeMsg[269];
  272.     var profile = febeMsg[270];
  273.     var alternate = febeMsg[271];
  274.     var both = febeMsg[272];
  275.     var txt;
  276.     switch(febeBUtype){
  277.         case "selective":
  278.             buProfile = false;
  279.             txt = selective;
  280.             break;
  281.         case "profile":
  282.             buProfile = true;
  283.             txt = profile;
  284.             break;
  285.         case "alternate":
  286.             var lastbutype = febePrefs.getCharPref("extensions.febe.lastbackup.type");
  287.             buProfile = false;
  288.             if(lastbutype == "selective"){buProfile = true;}
  289.             if(buProfile == true){
  290.                 type = profile;
  291.             }else{
  292.                 type = selective;
  293.             }//if
  294.             txt = alternate +" ("+type+")";
  295.             break;
  296.         case "both":
  297.             buProfile = false;
  298.             txt = both + "  ("+selective+" & "+profile+")";
  299.             break;
  300.     }//switch
  301.     febeSetUnicharPref("extensions.febe.lastbackup.Type",txt);
  302.     return txt;
  303. }//febeGetBuType()
  304.  
  305. function febeBuInProgress(){
  306.     return febePrefs.getBoolPref("extensions.febe.backupInProgress");
  307. }//febeBuInProgress()
  308.  
  309. function febeBuInProgressCheck(){
  310.     var style = "<style>color: red; font-weight: bold; font-size: 15px;</style>";
  311.     var tmp = style+febeMsg[229]+"\n\n"
  312.     style = "<style>color: black; font-size: 14px;</style>";
  313.     tmp += style+febeMsg[230]+"\n\n";
  314.     style = "<style>color: purple; font-size: 15px;</style>";
  315.     tmp += style+febeMsg[231];
  316.     if(!febeConfirm(tmp)){
  317.         febePrefs.setBoolPref("extensions.febe.backupInProgress",false);
  318.         return false;
  319.     }//if
  320.     return true;
  321. }//febeBuInProgressCheck()
  322.  
  323. function febeAbort(){
  324.   // 'Abort' button pressed
  325.     febePrefs.setBoolPref("extensions.febe.backupInProgress",false);
  326.     window.close();
  327.     return false;
  328. }//febeAbort()
  329.  
  330. function febeInitPref(prefName, dflt){
  331.   // Set a preference to default if needed
  332.     if(!febePrefs.prefHasUserValue(prefName)){        
  333.         febeSetUnicharPref(prefName,dflt);
  334.     }else if(febeGetUnicharPref(prefName) == ""){
  335.         febeSetUnicharPref(prefName,dflt);
  336.     }//if
  337.     return true;
  338. }//febeInitPref()
  339.  
  340. // Object declarations
  341. function febeExtObj(Name, Type, Version, Path, Icon, Home, Guid, Verified, Include, isDisabled, Minversion, Maxversion){
  342.     this.Name = new String(Name);
  343.     this.Type = new Number(Type);
  344.     this.Version = new String(Version);
  345.     this.Path = new String(Path); 
  346.     this.Icon = new String(Icon); 
  347.     this.Home = new String(Home); 
  348.     this.Guid = new String(Guid); 
  349.     this.Verified = Boolean(Verified);
  350.     this.Include = Boolean(Include);
  351.     this.isDisabled = Boolean(isDisabled);
  352.     this.Minversion = new String(Minversion); 
  353.     this.Maxversion = new String(Maxversion); 
  354.     return true;
  355. }//febeExtObj
  356.  
  357. function febeUDBuDoneObj(Description, Name){
  358.     this.Description = Description;
  359.     this.Name = Name;
  360.     return true;
  361. }//febeUDBuDoneObj()
  362.  
  363. function febeSetTimeoutObj(PID,Process,Started,Wait){
  364.     this.PID = PID;
  365.     this.Process = Process;
  366.     this.Started = Started;
  367.     this.Wait = Wait;
  368.     return true;
  369. }//febeSetTimeoutObj
  370.  
  371. function febeCookieObj(expires, host, isDomain, isSecure, name, path, policy, status, value){
  372.     this.expires = expires;
  373.     this.host = host;
  374.     this.isDomain = isDomain;
  375.     this.isSecure = isSecure;
  376.     this.name = name;
  377.     this.path = path;
  378.     this.policy = policy;
  379.     this.status = status;
  380.     this.value = value;
  381. }//febeCookieObj()
  382.  
  383. function febePrefObj(Name, Type, Value){
  384.     this.Name = Name;
  385.     this.Type = Type;
  386.     this.Value = Value;
  387. }//febePrefObj()
  388.  
  389. function febeGetPlatform(){
  390.     var platform = navigator.platform.toLowerCase();
  391.     febePlatform = 2;    // Default to *nix since there are so many different flavors
  392.     if(platform.indexOf("win") != -1){febePlatform = 1;}
  393.     if(platform.indexOf("linux") != -1){febePlatform = 2;}
  394.     if(platform.indexOf("unix") != -1){febePlatform = 2;}
  395.     if(platform.indexOf("sunos") != -1){febePlatform = 2;}
  396.     if(platform.indexOf("darwin") != -1){febePlatform = 3;}
  397.     if(platform.indexOf("macintel") != -1){febePlatform = 3;}
  398.     if(platform.indexOf("macppc") != -1){febePlatform = 3;}
  399.     
  400.     return febePlatform;
  401. }//febeGetPlatform()
  402.  
  403. function getFebeVersion() {
  404.     var em = Cc["@mozilla.org/extensions/manager;1"].getService(Ci.nsIExtensionManager);
  405.     var ext = null;
  406.     if (em.getItemForID){
  407.         ext = em.getItemForID(FEBE_GUID);
  408.     }else{
  409.         ext = em.getItemList(FEBE_GUID, null, {})[0];
  410.     }//if
  411.     return ext.version;
  412. }//getFebeVersion()
  413.  
  414. function setFebeVersion(){
  415.     febeSetMsgs();
  416.     if(document.getElementById("febeVersionID")){
  417.         var version = getFebeVersion();
  418.         document.getElementById("febeVersionID").value = febeMsg[49]+" "+version;
  419.     }//if
  420.     version = Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULAppInfo).version;
  421.     if(document.getElementById("febeFxVersionID")){
  422.         document.getElementById("febeFxVersionID").value = version;
  423.     }//if
  424.     return true;
  425. }//setFebeVersion()
  426.  
  427. function febeValidateMaxDirs(){
  428.     var maxDirs = document.getElementById("maxBuDirsID").value;
  429.     if(isNaN(maxDirs)){
  430.         var w = this.window;
  431.         febeAlert(febeMsg[101]);
  432.         w.focus();
  433.         document.getElementById("maxBuDirsID").focus();
  434.         document.getElementById("maxBuDirsID").select();
  435.         return false;
  436.     }//if
  437.     document.getElementById("maxBuDirsID").value = parseInt(maxDirs);
  438.     return true;
  439. }//febeValidateMaxDirs()
  440.     
  441. function febeOpenLink(URL){
  442.     if(!URL){return;}
  443.     var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
  444.     var win = wm.getMostRecentWindow("navigator:browser");
  445.     //var win = window;
  446.     var febeGetBrowser = win.getBrowser();
  447.     var currBlank = (febeGetBrowser &&
  448.         (febeGetBrowser.mCurrentTab.linkedBrowser &&
  449.         (febeGetBrowser.mCurrentTab.linkedBrowser.contentDocument.location == "about:blank")) ||
  450.         (!febeGetBrowser.mCurrentTab.linkedBrowser &&
  451.         (febeGetBrowser.mCurrentTab.label == "(Untitled)")));
  452.     if(currBlank){
  453.         var resultsWindow = win.loadURI(URL);
  454.     }else{
  455.         var resultsWindow = win.openNewTabWith(URL, this.docURL, null, null);
  456.     }//if
  457.     var win = "";    // Clear memory
  458.     return true;
  459. }//febeOpenLink()
  460.  
  461. function febeOpenResultsPage(URL){
  462.     if(!URL){return;}
  463.     var win = febeControllerWindow;
  464.     var febeGetBrowser = win.getBrowser();
  465.     var currBlank = (febeGetBrowser &&
  466.         (febeGetBrowser.mCurrentTab.linkedBrowser &&
  467.         (febeGetBrowser.mCurrentTab.linkedBrowser.contentDocument.location == "about:blank")) ||
  468.         (!febeGetBrowser.mCurrentTab.linkedBrowser &&
  469.         (febeGetBrowser.mCurrentTab.label == "(Untitled)")));
  470.     if(currBlank){
  471.         var resultsWindow = win.loadURI(URL);
  472.     }else{
  473.         var resultsWindow = win.openNewTabWith(URL, this.docURL, null, null);
  474.     }//if
  475.     var win = "";    // Clear memory
  476.     return true;
  477. }//febeOpenResultsPage()
  478.  
  479. function febeHideHelpIcons(){
  480.     var prefName = "extensions.febe.hidehelp";
  481.     febeHideHelp = febePrefs.getBoolPref(prefName);
  482.     var c = "helpButton";
  483.     if(febeHideHelp){c = "none";}
  484.     for(var i=1; i<40; i++){
  485.         var seq = String(i);
  486.         if(i<10){seq = "0".concat(seq);}
  487.         var id = "febeHelp".concat(seq);
  488.         try{    
  489.             document.getElementById(id).setAttribute("class",c) ;
  490.         }catch(e){;}
  491.     }
  492.     return true;
  493. }//febeHideHelpIcons()    
  494.  
  495. function febeOptions(aPaneID){
  496.     var febeWin = window.openDialog('chrome://febe/content/settings/febeOptions.xul', 'FEBE Options', 'chrome,titlebar,toolbar,centerscreen,resizable');    
  497.     febeWin.focus();
  498.     return true;
  499. }//febeOptions()
  500.  
  501. function febeHelp(helpIndex,fieldName){
  502.     var febeWin = window.openDialog("chrome://febe/content/febeHelp.xul", "FEBE Help", "chrome,dialog=yes,alwaysRaised,resizable,titlebar=no,popup=yes",helpIndex,fieldName);
  503.     febeWin.focus();
  504.     return true;
  505. }//febeHelp()
  506.  
  507. function febeAlert(message,modal){
  508.     var febeMsgType = febePrefs.getCharPref("extensions.febe.alertType");
  509.     if(febeMsgType == "standard"){ // Use plain old alerts instead of sliders
  510.         alert(febeRemoveStyle(message));
  511.         return true;    
  512.     }//if
  513.     var opts = "chrome,dialog=yes,alwaysRaised,resizable,titlebar=no,popup=yes";
  514.     if(modal){opts = "chrome,dialog=yes,modal,alwaysRaised,resizable,titlebar=no,popup=yes";}
  515.     var febeWin = window.openDialog("chrome://febe/content/febeAlert.xul", "FEBE Alert", opts ,message);    
  516.     febeWin.focus();
  517.     return true;
  518. }//febeAlert()
  519.  
  520. function febeConfirm(message){
  521.     var febeWin = window.openDialog("chrome://febe/content/febeConfirm.xul", "FEBE Confirm", "chrome,modal,dialog=yes,alwaysRaised,resizable,titlebar=no,popup=yes",message);    
  522.     febeWin.focus();
  523.     var prefName = "extensions.febe.confirm";
  524.     var OK = febePrefs.getBoolPref(prefName);
  525.     return OK;
  526. }//febeConfirm()
  527.  
  528. function febeConfirmAsk(message){
  529.     var febeWin = window.openDialog("chrome://febe/content/febeConfirmAsk.xul", "FEBE Confirm", "chrome,modal,dialog=yes,alwaysRaised,resizable,titlebar=no,popup=yes",message);    
  530.     febeWin.focus();
  531.     var prefName = "extensions.febe.confirm";
  532.     var OK = febePrefs.getBoolPref(prefName);
  533.     return OK;
  534. }//febeConfirmAsk()
  535.  
  536. function febeError(message){
  537.     var febeMsgType = febePrefs.getCharPref("extensions.febe.alertType");
  538.     if(febeMsgType == "standard"){ // Use plain old alerts instead of sliders
  539.         alert(febeRemoveStyle(message));
  540.         return true;    
  541.     }//if
  542.     var febeWin = window.openDialog("chrome://febe/content/febeError.xul", "FEBE Error", "chrome,modal,dialog=yes,alwaysRaised,resizable,titlebar=no,popup=yes",message);
  543.     febeWin.focus();    
  544.     return true;
  545. }//febeError()
  546.  
  547. function febeConfirmOK(){
  548.     var prefName = "extensions.febe.confirm";
  549.     febePrefs.setBoolPref(prefName,true);
  550.     return true;
  551. }//febeConfirmOK()
  552.  
  553. function febeConfirmCancel(){
  554.     var prefName = "extensions.febe.confirm";
  555.     febePrefs.setBoolPref(prefName,false);
  556.     return true;
  557. }//febeConfirmOK()
  558.  
  559. function febeSetAlertMsg(){
  560.     febeSetConfirmMsg();
  561.     return true;
  562. }//febeSetAlertMsg()
  563.     
  564. function febeSetConfirmMsg(){
  565.     // If the message contains a style, it must be the first part of the message (one style per line, if needed)
  566.     var tmp = window.arguments[0]+"   \n\n";
  567.     var msg = {};
  568.     var i = 0;
  569.     while(true){    // Break it into an array
  570.         var item = new febeAlertObj();
  571.         var p = tmp.indexOf("\n");
  572.         if(p == -1){break;}
  573.         item.Style = "font-family: arial; font-size: 10pt; font-weight: normal; color: purple";  // Default style
  574.         var ps1 = tmp.indexOf("<style>");
  575.         if(ps1 == 0){    
  576.             var ps2 = tmp.indexOf("</style>");
  577.             if(ps2 != -1){
  578.                 item.Style = tmp.substr(7,ps2-7);            // "7" equals the length of "<style>"
  579.                 tmp = tmp.replace(tmp.substr(0,ps2+8),"");    // Remove the style
  580.                 p = tmp.indexOf("\n");
  581.             }//if
  582.         }//if
  583.         item.Text = tmp.substr(0,p);
  584.         msg[i] = item;
  585.         i++;
  586.         tmp = tmp.substr(p+1);    
  587.     }//while
  588.     febeClipboard = [];
  589.     var msgBox = document.getElementById("febeMsgBox");
  590.     if(msgBox){
  591.         for(var i in msg){
  592.             var desc = document.createElement("description");
  593.             desc.textContent = msg[i].Text;
  594.             desc.setAttribute("style",msg[i].Style);
  595.             msgBox.appendChild(desc);
  596.             febeClipboard.push(msg[i].Text);
  597.         }//for
  598.         document.documentElement.getButton("extra1").hidden = false;
  599.     }//if
  600.     var sound = Application.storage.get("alertsound", "alert");
  601.     febePlaySound(sound);
  602.     Application.storage.set("alertsound", "alert")
  603.     return true;
  604. }//febeSetConfirmMsg()
  605.  
  606. function febeSliderLoad(){
  607.     sizeToContent();
  608.     febeAlertFinalHeight = window.outerHeight;
  609.     window.outerHeight = 1;
  610.     var x =(screen.availLeft + screen.availWidth - window.outerWidth) - 10;
  611.     var y = screen.availTop + screen.availHeight - window.outerHeight;
  612.     window.moveTo(x,y);
  613.     window.focus();
  614.     setTimeout(febeAnimateAlert, 25);
  615. }//febeSliderLoad()
  616.  
  617. function febeAnimateAlert(){
  618.      var febeAlertSliderIncrement = 10;    // Amount the slider grows by (pixels)
  619.     var febeAlertSliderTime = 25;        // Time between increments (milliseconds)
  620.     
  621.     if(window.outerHeight < febeAlertFinalHeight){
  622.         window.screenY -= febeAlertSliderIncrement;
  623.         window.outerHeight += febeAlertSliderIncrement;
  624.         setTimeout(febeAnimateAlert, febeAlertSliderTime);
  625.     }//if
  626. }//febeAnimateAlert()
  627.  
  628. function febeCopyToClipboard(){
  629.   // Copy the contents of a febeAlert, febeConfirm, or febeError box to the system clipboard
  630.     var gClipboardHelper = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
  631.     gClipboardHelper.copyString(febeClipboard.join("\n"));
  632.     return true;
  633. }//febeCopyToClipboard()
  634.  
  635. function febeAlertObj(Text,Style){
  636.     this.Text = Text;
  637.     this.Style = Style;
  638.     return true;
  639. }//febeAlertObj()
  640.  
  641. function febePlaySound(which){
  642.     febePlaySounds = febePrefs.getBoolPref("extensions.febe.playSounds");
  643.     if(febePlaySounds == false){return;}
  644.     var gSound = Cc["@mozilla.org/sound;1"].createInstance(Ci.nsISound);
  645.     var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  646.     var soundURL = "chrome://febe/content/sounds/"+which+".wav";
  647.     var url = ioService.newURI(soundURL, null, null);
  648.     gSound.init();
  649.     gSound.play(url);
  650.     return true;
  651. }//febePlaySound()
  652.  
  653. function febePlaySoundHelp(which){
  654.   // Alway play sounds in the "Play sounds" help window
  655.     var gSound = Cc["@mozilla.org/sound;1"].createInstance(Ci.nsISound);
  656.     var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  657.     var soundURL = "chrome://febe/content/sounds/"+which+".wav";
  658.     var url = ioService.newURI(soundURL, null, null);
  659.     gSound.init();
  660.     gSound.play(url);
  661.     return true;
  662. }//febePlaySoundHelp()
  663.  
  664. function febeParent(pathname){
  665.   // Return the parent of pathname.  Ex:
  666.   // If pathname is "C:\Documents and Settings\Owner\My Documents\some dir",
  667.   // the function will return "C:\Documents and Settings\Owner\My Documents"
  668.   
  669.     var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  670.     file.initWithPath(pathname);
  671.     return file.parent.path;
  672. }//febeParent()
  673.  
  674. function febeLeafname(pathname){
  675.   // Return the leafname of pathname.  Ex:
  676.   // If pathname is "C:\Documents and Settings\Owner\My Documents\some dir",
  677.   // the function will return "some dir"
  678.   
  679.     var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  680.     file.initWithPath(pathname);
  681.     return file.leafName;
  682. }//febeLeafname()
  683.  
  684. function febePause(millis){
  685.   // Pause for (millis) milliseconds
  686.     var date = new Date();
  687.     var curDate = null;
  688.     
  689.     do {curDate = new Date();}
  690.         while(curDate-date < millis);
  691.     return true;
  692. }//febePause() 
  693.  
  694. function febeWrap(str,len){    
  695.   // Return a string wrapped at len characters max per line
  696.     str = str.toString();
  697.     var tmpA = str.split(" ");
  698.     var returnVal="";
  699.     var tmp = "";
  700.     var skip = Boolean(false);
  701.     for(var i = 0; i < tmpA.length; i++){
  702.         tmp += tmpA[i]+" ";
  703.         if(tmp.length >= len){
  704.             returnVal +="\n"+tmpA[i]+" ";
  705.             tmp = "";
  706.             i--;
  707.             skip = true;
  708.         }else{
  709.             if(skip == false){returnVal += tmpA[i]+" ";}
  710.             skip = false;
  711.         }//if
  712.     }//for
  713.     return returnVal;
  714. }//function febeWrap()
  715.  
  716. function febeFatal(err,msg){
  717.   // Display fatal errors
  718.     if(err.toString().indexOf(febeIgnoreError) != -1){return true;}
  719.     var style = "<style>color: black;font-size: 8pt;</style>";
  720.     var tmp = febeWrap(err.toString(),100);
  721.     tmp = tmp.replace(/\n/g,"\n"+style);
  722.     tmp = style + tmp;
  723.     tmp +="\n\n";
  724.     var ptSize = 12;
  725.     if(msg.length > 100){ptSize = 8;}
  726.     style = "<style>color: red;font-size: "+ptSize+"pt;</style>";
  727.     msg = msg.replace(/\n/g,"\n"+style);
  728.     tmp += style+msg;
  729.     febeError(tmp);
  730.     throw err;
  731.     return true;
  732. }//febeFatal()
  733.  
  734. function febeRestoreError(err,msg){
  735.   // Trap restore errors
  736.     if(febeIgnoreError == "all"){return true;}
  737.     var style = "<style>color: black;font-size: 8pt;</style>";
  738.     var tmp = febeWrap(err.toString(),100);
  739.     tmp = tmp.replace(/\n/g,"\n"+style);
  740.     tmp = style + tmp;
  741.     tmp +="\n\n";
  742.     var ptSize = 12;
  743.     if(msg.length > 100){ptSize = 8;}
  744.     style = "<style>color: red;font-size: "+ptSize+"pt;</style>";
  745.     msg = msg.replace(/\n/g,"\n"+style);
  746.     tmp += style+msg;
  747.     var message = tmp;
  748.     var febeWin = window.openDialog("chrome://febe/content/febeRestoreError.xul", "FEBE Restore Error", "chrome,modal,dialog=yes,alwaysRaised,resizable,titlebar=no,popup=yes",message);
  749.     febeSetAlertMsg();
  750.     return true;
  751. }//ffebeRestoreError()
  752.  
  753. function febeLocalizedDate(aDate){
  754.     var lDate = new Date(aDate);
  755.     var rv = lDate.toLocaleDateString()+" "+lDate.toLocaleTimeString();
  756.     if(rv.indexOf("Invalid") != -1){rv = aDate;}
  757.     return rv;
  758. }//febeLocalizedDate()
  759.  
  760. function febeNewDirName(which,dirName){
  761.   // Rename timestamped directories from/to ISO8601 to European
  762.     var str = dirName.substr(10,5);
  763.     switch(which){
  764.         case 0:    // Rename DD.MM to MM-DD
  765.             str = str.substr(3,2)+"-"+str.substr(0,2);
  766.             break;
  767.         case 1:    // Rename MM-DD to DD.MM
  768.             str = str.substr(3,2)+"."+str.substr(0,2);
  769.             break;
  770.     }//switch
  771.     var newName = dirName.substr(0,10) + str + dirName.substr(15);
  772.     return newName;
  773. }//febeNewDirName(which,dirName)
  774.  
  775. function febeExtInfo(extGuid){
  776.   // Get extension info from extensions.rdf
  777.  
  778.     var rdfs = Cc["@mozilla.org/rdf/rdf-service;1"].getService(Ci.nsIRDFService);
  779.                      
  780.     var profileDir = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
  781.     profileDir.append("extensions.rdf");
  782.     
  783.     // Fix for international characters
  784.     var ioServ = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  785.     var fph = ioServ.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler);
  786.     var srcFile = fph.getURLSpecFromFile(profileDir);
  787.     
  788.     var ds = rdfs.GetDataSourceBlocking(srcFile);
  789.     
  790.     // Use old method if something comes up undefined
  791.     var em = Cc["@mozilla.org/extensions/manager;1"].getService(Ci.nsIExtensionManager);
  792.     var ext = null;
  793.     if (em.getItemForID){
  794.         ext = em.getItemForID(extGuid);
  795.     }else{
  796.         ext = em.getItemList(extGuid, null, {})[0];
  797.     }//if
  798.     this.isInvalid = Boolean(false);
  799.     if(!ext){
  800.         var style = "<style>color: red;font-size: 12pt;</style>";
  801.         var tmp = style+febeMsg[219].replace("%GUID%",extGuid)+"\n";
  802.         if(!Application.storage.get("runningVerifyExtRoutine", false)){febeAlert(tmp);}
  803.         this.isInvalid = Boolean(true);
  804.         return false;
  805.     }//if
  806.     
  807.     var subject = rdfs.GetResource("urn:mozilla:item:"+extGuid);
  808.     var prefix = "http://www.mozilla.org/2004/em-rdf#";
  809.     
  810.   // Guid
  811.     this.guid = extGuid;
  812.     
  813.   // Name
  814.     var predicate = rdfs.GetResource(prefix + "name");
  815.     var name = ds.GetTarget(subject, predicate, true);
  816.     if(name){
  817.         this.name = name.QueryInterface(Ci.nsIRDFLiteral).Value;
  818.     }else{
  819.         this.name = ext.name;
  820.     }//if
  821.     if(!this.name){this.name="(none)";}
  822.     
  823.   // Version
  824.     var predicate = rdfs.GetResource(prefix + "version");
  825.     var version = ds.GetTarget(subject, predicate, true);
  826.     if(version){
  827.         this.version = version.QueryInterface(Ci.nsIRDFLiteral).Value;
  828.     }else{
  829.         this.version = ext.version;
  830.     }//if
  831.     if(!this.version){this.version="(none)";}
  832.  
  833.   // Description
  834.     var predicate = rdfs.GetResource(prefix + "description");
  835.     var description = ds.GetTarget(subject, predicate, true);
  836.     if(description){this.description = description.QueryInterface(Ci.nsIRDFLiteral).Value;}
  837.     if(!this.description){this.description="(none)";}
  838.  
  839.   // Home Page URL
  840.     var predicate = rdfs.GetResource(prefix + "homepageURL");
  841.     var homepageURL = ds.GetTarget(subject, predicate, true);
  842.     if(homepageURL){this.homepageURL = homepageURL.QueryInterface(Ci.nsIRDFLiteral).Value;}
  843.     if(!this.homepageURL){this.homepageURL="";}
  844.  
  845.   // Creator
  846.     var predicate = rdfs.GetResource(prefix + "creator");
  847.     var creator = ds.GetTarget(subject, predicate, true);
  848.     if(creator){this.creator = creator.QueryInterface(Ci.nsIRDFLiteral).Value;}
  849.     if(!this.creator){this.creator="(none)";}
  850.  
  851.   // Disabled?
  852.     var predicate = rdfs.GetResource(prefix + "userDisabled");
  853.     var userDisabled = ds.GetTarget(subject, predicate, true);
  854.     if(userDisabled){
  855.         this.isDisabled = userDisabled.QueryInterface(Ci.nsIRDFLiteral).Value;
  856.     }else{
  857.         this.isDisabled = false;
  858.     }//if
  859.  
  860.   // iconURL
  861.     var predicate = rdfs.GetResource(prefix + "iconURL");
  862.     var iconURL = ds.GetTarget(subject, predicate, true);
  863.     if(iconURL){
  864.         this.iconURL = iconURL.QueryInterface(Ci.nsIRDFLiteral).Value;
  865.     }else{
  866.         this.iconURL = ext.iconURL;
  867.     }//if
  868.     if(!this.iconURL){this.iconURL="chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png";}
  869.     
  870.   // minVersion
  871.     this.minVersion = ext.minAppVersion;
  872.     if(!this.minVersion){this.minVersion="(none)";}
  873.     
  874.   // maxVersion    
  875.     this.maxVersion = ext.maxAppVersion;
  876.     if(!this.maxVersion){this.maxVersion="(none)";}
  877.     
  878.   // installLocation
  879.     var predicate = rdfs.GetResource(prefix + "installLocation");
  880.     var installLocation = ds.GetTarget(subject, predicate, true);
  881.     if(installLocation){this.installLocation = installLocation.QueryInterface(Ci.nsIRDFLiteral).Value;}
  882.     if(!this.installLocation){this.installLocation="(none)";}
  883.     
  884.   // parseType
  885.     var predicate = rdfs.GetResource(prefix + "type");
  886.     var parseType = ds.GetTarget(subject, predicate, true);
  887.     if(parseType){
  888.         this.type = parseType.QueryInterface(Ci.nsIRDFInt).Value;
  889.     }else{
  890.         this.type = ext.type;
  891.     }//if
  892.  
  893.   // internalName
  894.     var predicate = rdfs.GetResource(prefix + "internalName");
  895.     var internalName = ds.GetTarget(subject, predicate, true);
  896.     if(internalName){this.internalName = internalName.QueryInterface(Ci.nsIRDFLiteral).Value;}
  897.     if(!this.internalName){this.internalName="(none)";}
  898.     
  899.   // updateURL
  900.     var predicate = rdfs.GetResource(prefix + "updateURL");
  901.     var updateURL = ds.GetTarget(subject, predicate, true);
  902.     if(updateURL){this.updateURL = updateURL.QueryInterface(Ci.nsIRDFLiteral).Value;}
  903.     if(!this.updateURL){this.updateURL="(none)";}
  904.     
  905.   // optionsURL
  906.     var predicate = rdfs.GetResource(prefix + "optionsURL");
  907.     var optionsURL = ds.GetTarget(subject, predicate, true);
  908.     if(optionsURL){this.optionsURL = optionsURL.QueryInterface(Ci.nsIRDFLiteral).Value;}
  909.     if(!this.optionsURL){this.optionsURL="(none)";}
  910.     
  911.   // aboutURL
  912.     var predicate = rdfs.GetResource(prefix + "aboutURL");
  913.     var aboutURL = ds.GetTarget(subject, predicate, true);
  914.     if(aboutURL){this.aboutURL = aboutURL.QueryInterface(Ci.nsIRDFLiteral).Value;}
  915.     if(!this.aboutURL){this.aboutURL="(none)";}
  916.     
  917.   // availableUpdateURL
  918.     var predicate = rdfs.GetResource(prefix + "availableUpdateURL");
  919.     var availableUpdateURL = ds.GetTarget(subject, predicate, true);
  920.     if(availableUpdateURL){this.availableUpdateURL = availableUpdateURL.QueryInterface(Ci.nsIRDFLiteral).Value;}
  921.     if(!this.availableUpdateURL){this.availableUpdateURL="(none)";}
  922.     
  923.   // availableUpdateHash
  924.     var predicate = rdfs.GetResource(prefix + "availableUpdateHash");
  925.     var availableUpdateHash = ds.GetTarget(subject, predicate, true);
  926.     if(availableUpdateHash){this.availableUpdateHash = availableUpdateHash.QueryInterface(Ci.nsIRDFLiteral).Value;}
  927.     if(!this.availableUpdateHash){this.availableUpdateHash="(none)";}
  928.     
  929.   // availableUpdateVersion
  930.     var predicate = rdfs.GetResource(prefix + "availableUpdateVersion");
  931.     var availableUpdateVersion = ds.GetTarget(subject, predicate, true);
  932.     if(availableUpdateVersion){this.availableUpdateVersion = availableUpdateVersion.QueryInterface(Ci.nsIRDFLiteral).Value;}
  933.     if(!this.availableUpdateVersion){this.availableUpdateVersion="(none)";}
  934.     
  935.   // contributors
  936.     var predicate = rdfs.GetResource(prefix + "contributor");
  937.     var targets = ds.GetTargets(subject, predicate, true);
  938.     var contributors = [];
  939.     if(targets){
  940.         while (targets.hasMoreElements()){
  941.             var contributor = targets.getNext();
  942.             if (contributor instanceof Ci.nsIRDFLiteral){
  943.                 contributors.push(contributor.Value);
  944.             }//if
  945.         }//while
  946.         this.contributors = contributors;
  947.     }//if
  948.     return true;
  949. }//febeExtInfo()
  950.  
  951. function febeStripSpaces(extName){
  952.   // Remove spaces and undesirable characters from extension name
  953.     var tmp = "";
  954.     var mask = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  955.     mask += ".+-_";
  956.     
  957.     if(extName){
  958.         for (var i = 0; i <= extName.length; i++){
  959.             var c = extName.charAt(i);
  960.             if( mask.indexOf(c) != -1 ){tmp += c};
  961.         }//for
  962.     }//if
  963.     return tmp;
  964. }//febeStripSpaces()
  965.  
  966. function febeCopyFile(sourcefile,destdir,dName){
  967.     if(dName == "parent.lock"){return true;}    // File is locked
  968.     var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  969.     if (!aFile) return false;
  970.     var aDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  971.     if (!aDir) return false;
  972.     aFile.initWithPath(sourcefile);
  973.     aDir.initWithPath(destdir);
  974.     var oFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  975.     oFile.initWithPath(destdir);
  976.     oFile.append(dName);
  977.     try{
  978.         oFile.remove(false);
  979.     }catch(e){;}
  980.         
  981.     try{
  982.         aFile.copyTo(aDir,dName);
  983.     }catch(e){
  984.         var msg = febeMsg[168].replace("%sourcefile%",sourcefile+"\n");
  985.         msg = msg.replace("%destdir%",destdir+"\n");
  986.         msg = msg.replace("%dName%",dName);
  987.         febeFatal(e,msg);
  988.         return false;
  989.     }
  990.     return true;
  991. }//febeCopyFile
  992.  
  993. function febeGetBuDate(filename){
  994.     var oFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  995.     oFile.initWithPath(filename);
  996.     febeBUdate = new Date(oFile.lastModifiedTime);
  997.     return febeBUdate;
  998. }//febeGetBuDate()
  999.  
  1000. function febeRestartFx(){
  1001.     // Borrowed from Jed Brown's "Restart Firefox" extension
  1002.     a = Ci.nsIAppStartup,Cc["@mozilla.org/toolkit/app-startup;1"].getService(a).quit(a.eRestart | a.eAttemptQuit);
  1003.     return true;
  1004. }//febeRestartFx()
  1005.  
  1006. function febePause(millis){
  1007.     date = new Date();
  1008.     var curDate = null;
  1009.     do { var curDate = new Date(); }
  1010.         while(curDate-date < millis);
  1011.     return true;
  1012. }//febePause()
  1013.  
  1014. function febeObfuscate(bool, str){
  1015.   //Modified base64 obfuscation
  1016.     switch(bool){
  1017.         case true:
  1018.             try{    //Bug 439711 - btoa does not work on unicode characters, so use encodeURIComponent() instead
  1019.                 var test = btoa(str);
  1020.             }catch(e){
  1021.                 str = "0"+encodeURIComponent(str);
  1022.                 return str.toString();
  1023.             }//try
  1024.             var r=Math.floor(Math.random()*4+2);
  1025.             for(var i=0; i<r; i++){
  1026.                 str = btoa(str);
  1027.             }                
  1028.             return i.toString()+str;
  1029.             break;
  1030.         case false:
  1031.             var c = new Number(str.charAt(0));
  1032.             str = str.substr(1);
  1033.             if(c == 0) {return decodeURIComponent(str);}
  1034.             for(var i=0; i<c; i++){
  1035.                 str = atob(str);
  1036.             }    
  1037.             return str;
  1038.             break;
  1039.         default:
  1040.             return null;
  1041.             break;
  1042.     }
  1043. }//febeObfuscate()
  1044.  
  1045. function febeConvertToDataUrl(url){
  1046.     var defaultimg = "chrome://febe/skin/xpinstallItemGeneric.png";
  1047.     try{
  1048.         var ioserv = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); 
  1049.         var channel = ioserv.newChannel(url, 0, null); 
  1050.         var stream = channel.open(); 
  1051.  
  1052.         if (channel instanceof Ci.nsIHttpChannel && channel.responseStatus != 200) {return defaultimg; }
  1053.  
  1054.         var bstream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream); 
  1055.         bstream.setInputStream(stream); 
  1056.  
  1057.         var size = 0; 
  1058.         var file_data = ""; 
  1059.         while(size = bstream.available()) { 
  1060.             file_data += bstream.readBytes(size); 
  1061.         }//while
  1062.         var data = btoa(file_data);
  1063.         var retval = "data:image;base64,"+data;
  1064.     }catch(e){
  1065.         var retval = defaultimg;
  1066.     }//try/catch
  1067.     return retval;
  1068. }//febeConvertToDataUrl()
  1069.  
  1070. function febeChmod(aDir){
  1071. // Recursively set file permissions
  1072. //  Directories: 0755
  1073. //  Files: 0644
  1074.     if(febePlatform == 1) return true;    // Don't bother with Windows
  1075.     var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1076.     if (!aFile) return false;
  1077.  
  1078.     aFile.initWithPath(aDir);
  1079.     var entries = aFile.directoryEntries;
  1080.     
  1081.     while(entries.hasMoreElements()){
  1082.         var entry = entries.getNext();
  1083.         entry.QueryInterface(Ci.nsIFile);
  1084.         var src = entry.path;
  1085.         if(entry.isDirectory()){
  1086.             entry.permissions = 0755;
  1087.             febeChmod(src);
  1088.         }else{
  1089.             entry.permissions = 0644;
  1090.         }//if
  1091.     }//while
  1092.     return true;
  1093. }//febeChmod()
  1094.  
  1095. function febeEscape(str){
  1096.   // Convert apostrophes to double quotes
  1097.     return str.replace(/\'/g,'"');
  1098. }//febeEscape()
  1099.  
  1100. function febeDontAskAgain(){
  1101.     var d = document.getElementById('dontask');
  1102.     var dontask = d.checked;
  1103.     var prefName = "";    
  1104.     febePrefs.setBoolPref("extensions.febe.dontaskagain",dontask);
  1105.     return true;
  1106. }//febeDontAskAgain()
  1107.  
  1108. function febeProps(e)
  1109. {
  1110. var obj = e;
  1111.   if (e === null) {
  1112.     alert("props called with null argument", "error");
  1113.     return;
  1114.   }
  1115.   if (e === undefined) {
  1116.     alert("props called with undefined argument", "error");
  1117.     return;
  1118.   }
  1119.   var ns = ["Methods", "Fields", "Unreachables"];
  1120.   var as = [[], [], []]; // array of (empty) arrays of arrays!
  1121.   var p, j, i; // loop variables, several used multiple times
  1122.   var protoLevels = 0;
  1123.   for (p = e; p; p = p.__proto__)
  1124.   {
  1125.     for (i=0; i<ns.length; ++i)
  1126.       as[i][protoLevels] = [];
  1127.     ++protoLevels;
  1128.   }
  1129.   var tmp = "";
  1130.   var c = 0
  1131.   for(var a in e){
  1132.   tmp += a;
  1133.   try{
  1134.   tmp += " = "+obj[a] + "\n";
  1135.   }catch(x){tmp += "\n";}
  1136.   c++;
  1137.   if(tmp.length > 500){
  1138.     alert(tmp);
  1139.     tmp = "";
  1140.     c = 0;
  1141. }
  1142.   continue;
  1143.     // Shortcoming: doesn't check that VALUES are the same in object and prototype.
  1144.     var protoLevel = -1;
  1145.     try
  1146.     {
  1147.       for (p = e; p && (a in p); p = p.__proto__)
  1148.         ++protoLevel;
  1149.     }
  1150.     catch(er) { protoLevel = 0; } // "in" operator throws when param to props() is a string
  1151.     var type = 1;
  1152.     try
  1153.     {
  1154.       if ((typeof e[a]) == "function")
  1155.         type = 0;
  1156.     }
  1157.     catch (er) { type = 2; }
  1158.     as[type][protoLevel].push(a);
  1159.   }
  1160.   tmp = 
  1161.   alert(tmp);
  1162.   
  1163.   function times(s, n) { return n ? s + times(s, n-1) : ""; }
  1164.   for (j=0; j<protoLevels; ++j)
  1165.     for (i=0;i<ns.length;++i)
  1166.       if (as[i][j].length) 
  1167.         alert(
  1168.           ns[i] + times(" of prototype", j), 
  1169.           (onePerLine ? "\n\n" : "") + as[i][j].sort().join(onePerLine ? "\n" : ", ") + (onePerLine ? "\n\n" : ""), 
  1170.           "propList"
  1171.         );
  1172. }//props()
  1173.  
  1174. function febeDoSomething(){
  1175.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  1176.                        .getService(Components.interfaces.nsIWindowMediator);
  1177.     var mostRecent = wm.getMostRecentWindow("navigator:browser");
  1178.     if(mostRecent == this.window){
  1179.         alert("true")
  1180.     }else{
  1181.         alert("false")
  1182.     }//if
  1183.     
  1184. }
  1185.  
  1186. function febeRemoveStyle(txt){
  1187.   // remove ,style> tag from txt
  1188.     var styleStart = txt.indexOf("<style>");
  1189.     if(styleStart == -1){return txt;}
  1190.     var styleEnd = txt.indexOf("</style>");
  1191.     if(styleEnd == -1){return txt;}
  1192.     return txt.substr(styleEnd+8);
  1193. }//febeRemoveStyle()
  1194. //alert("febeCommon.js loaded");
  1195.